package com.lxy.file;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;


/**整体流程: 前端的并发请求->后端线程池异步处理每个请求->每个请求先读在写Redis
 *
 * 第一阶段:RandomAccessFile VS MappedByteBuffer VS FileChannel
 *   使用常见RandomAccessFile解决分块上传 学习MappedByteBuffer之后改用内存映射速度更快一些
 *   date:2021-9-4 7:45 第一阶段基本完成(但还未改成MappedByteBuffer)
 *
 * 第二阶段: 加入线程池 ThreadTaskPoolExecutor+@Async异步调用+Future.get()方法进行阻塞 (看起来像是异步,
 * 执行起来CountDownLatch/Future.get()却是同步,所以速度很慢)
 * 思考 前端异步并发传输分块文件
 *   2.1第一感觉 线程池异常任务处理
 *   2.2 @EnableAsync开启异步线程池,定义线程池
 *   2.3 @Async异步调用
 *  问题: 因为异步调用返回过快,程序还没处理好,就调用新的方法导致只有部分数据上传成功
 *  解决: 方案(1):通过CountDownLatch(减少)/CyclicBarrier(增加)工具类(底层AQS+CAS+LockSupport阻塞) 当全部的子线程执行完之后
 *        主线程才返回,这样数据就不会有问题 但慢了一些
 *        方案(2):Future.get进行阻塞跟countDownLatch原理类似
 *         方案(3):CompletableFuture比上述两者都快一些 选用CompletableFuture
 *  *  衍生问题: 若前端上传文件过大，分块大小又设置得很小，导致分块过多，
 *  *  就会一瞬间的并发请求数量过多,如何解决?万一有些请求出现异常如何解决? (该场景可能不存在)
 *     若前端上传文件过小,达不到要分块的文件阈值,直接秒传
 *
 *     TODO 是否需要进行请求合并,将一瞬间的批量请求放入阻塞队列中,启用定时任务10ms执行一次,
 *          将这一瞬间的请求(请求数量必然与分块数量是一致的)加入队列批量执行这些请求,异步执行completableFuture任务
 *          然后在用future.get()进行阻塞?或者allof等这些请求的异步任务执行完?
 *     上述场景可能不存在

 * 第三阶段:OSS对象存储+线程池 解决分块上传
 *
 *
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class FileApplication {

    public static void main(String[] args) {
        SpringApplication.run(FileApplication.class, args);
    }

}
